package com.ccn.qrcode.utils.qrcodefile;

import cn.hutool.core.util.StrUtil;
import com.ccn.qrcode.common.Constant;
import com.ccn.qrcode.pojo.QrcodeFilePojo;
import com.ccn.qrcode.utils.MD5.MD5FileUtils;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;

/**
 * Qrcode 文件解析
 *
 * @author tig
 */
public class QrcodeFileUtils {
    private static final Logger logger = LoggerFactory.getLogger(QrcodeFileUtils.class);

    /**
     * 文件解析
     * 7283329080261779,https://cj8.ren/mp03/?67283329080261779077B40,6;6;8;6;8;6;6;3;3;6;3;3;8;6;2;8,D1101100052
     *
     * @param fileTxt
     * @return
     */
    public static QrcodeFilePojo qrcodeFile(String fileTxt) {
        QrcodeFilePojo filePojo = new QrcodeFilePojo();
        try {
            if (StrUtil.isEmpty(fileTxt)) {
                return null;
            }
            String[] splitFile = fileTxt.split(",");
            if (splitFile.length != 3) {
                logger.info("文件：" + fileTxt + "解析出错");
            }
            filePojo.setQrcodePath(splitFile[1]);
            String fileColor = splitFile[2];
            String[] splitColor = splitFile[2].split(";");
            if (splitColor.length != 16) {
                logger.info("文件：" + fileTxt + "解析绘图颜色出错");
            }
            filePojo.setFileColor(fileColor.substring(fileColor.length() - 7));
            String[] splitFileName = splitFile[1].split("\\?");
            if (splitFileName.length != 2) {
                logger.info("文件：" + fileTxt + "解析文件名称出错");
            }
            filePojo.setFileName(splitFileName[1]);
            //文件内容
            List<Integer> fakeList = new MD5FileUtils().Md5FileChange(splitFile[0], Constant.QR_VERSION);
            filePojo.setAntiFakeList(fakeList);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return filePojo;
    }

    /**
     * 通过文件名，获取文件
     * https://cj8.ren/mp04/?628782431941922448D3575
     */
    public static String getFileName(String name){
        String[] split = name.split("\\?");
        if(split.length!= 2){
            logger.info("文件名称:"+name+"获取纠错码错误");
        }
        return split[1].substring(1, 17);
    }

    /**
     * 文件格式转换
     * @param multipartFile
     * @return
     */
    public static File transferToFile(MultipartFile multipartFile) {
//        选择用缓冲区来实现这个转换即使用java 创建的临时文件 使用 MultipartFile.transferto()方法 。
        File file = null;
        try {
            String originalFilename = multipartFile.getOriginalFilename();
            String[] filename = originalFilename.split("\\.");
            file = File.createTempFile(filename[0], filename[1] + ".");
            multipartFile.transferTo(file);
            file.deleteOnExit();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return file;
    }

    /**
     * 根据颜色代码找颜色
     * @param fileColor
     * @return
     */
    public static int fileColor(String fileColor){
        int tmpFileColor = Constant.BLACK;
        switch (fileColor){
            case "3" :
                tmpFileColor = Constant.THREE; break;
            case "2":
                tmpFileColor = Constant.TWO; break;
            case "6":
                tmpFileColor = Constant.SEX; break;
            case "8":
                tmpFileColor = Constant.EIGHT; break;
        }
        return tmpFileColor;
    }

    // 创建目录（文件夹）删除的方法
    public void delete(String path) throws IOException {
        // 为传进来的路径参数创建一个文件对象
        File file = new File(path);
        if(!file.isDirectory()){
            file.createNewFile();
            file.mkdirs();
        }
        // 如果目标路径是一个文件，那么直接调用delete方法删除即可
        // file.delete();
        // 如果是一个目录，那么必须把该目录下的所有文件和子目录全部删除，才能删除该目标目录，这里要用到递归函数
        // 创建一个files数组，用来存放目标目录下所有的文件和目录的file对象
        File[] files = new File[50];
        // 将目标目录下所有的file对象存入files数组中
        files = file.listFiles();
        // 循环遍历files数组
        for(File temp : files){
            // 判断该temp对象是否为文件对象
            if (temp.isFile()) {
                temp.delete();
            }
            // 判断该temp对象是否为目录对象
            if (temp.isDirectory()) {
                // 将该temp目录的路径给delete方法（自己），达到递归的目的
                delete(temp.getAbsolutePath());
                // 确保该temp目录下已被清空后，删除该temp目录
                temp.delete();
            }
        }
    }


    /**
     * 对图片进行原比例无损压缩,压缩后覆盖原图片
     *
     * @param path
     */
    public static void doWithPhoto(String path) {
        File file = new File(path);
        if (!file.exists()) {
            return;
        }
        BufferedImage image = null;
        try {
            image = ImageIO.read(file);
            int width = image.getWidth();
            int height = image.getHeight();
            BufferedImage bfImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB_PRE);
            bfImage.getGraphics().drawImage(image.getScaledInstance(width, height, Image.SCALE_DEFAULT), 0, 0, null);
            // 输出图片
            File outputfile = new File("/Users/tig/tifffile/1.tiff");
            ImageIO.write(bfImage, "png", outputfile);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }




}
